From 382999025af8a95aa791fd00c24f24ecd54596d4 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Fri, 17 Jan 2025 19:28:11 +1000 Subject: [PATCH] shader_recompiler: Add stubs for CSM/FCSM flow test conditions Add stub implementations for previously unhandled flow test conditions in the shader recompiler's IR emitter. These conditions were previously throwing "Not Implemented" exceptions when encountered. The following flow test cases are now stubbed: - FCSM_TR (Fragment Shader Coarse/Fine Mode Test and Reject) - CSM_TA (Coarse/Fine Mode Test Accept) - CSM_TR (Coarse/Fine Mode Test and Reject) - CSM_MX (Coarse/Fine Mode Maximum) - FCSM_TA (Fragment Shader Coarse/Fine Mode Test Accept) - FCSM_MX (Fragment Shader Coarse/Fine Mode Maximum) Currently these stubs: 1. Return false (ir.Imm1(false)) as a placeholder value 2. Log a warning message indicating the stub 3. Allow shaders using these conditions to compile rather than fail This is a step toward proper implementation of coarse/fine mode shader operations. The stubs prevent crashes while making it clear which code paths need full implementation. Technical notes: - Removed the previous FCSM_TR implementation that used flag operations - Added consistent warning messages for tracking stub usage - Kept within the existing GetFlowTest switch statement structure --- dist/languages/ar.ts | 4 +- dist/languages/ca.ts | 4 +- dist/languages/cs.ts | 4 +- dist/languages/da.ts | 4 +- dist/languages/de.ts | 4 +- dist/languages/el.ts | 4 +- dist/languages/es.ts | 4 +- dist/languages/fr.ts | 4 +- dist/languages/hu.ts | 4 +- dist/languages/id.ts | 4 +- dist/languages/it.ts | 4 +- dist/languages/ja_JP.ts | 4 +- dist/languages/ko_KR.ts | 4 +- dist/languages/nb.ts | 4 +- dist/languages/nl.ts | 4 +- dist/languages/pl.ts | 4 +- dist/languages/pt_BR.ts | 4 +- dist/languages/pt_PT.ts | 4 +- dist/languages/ru_RU.ts | 6 +- dist/languages/sv.ts | 4 +- dist/languages/tr_TR.ts | 4 +- dist/languages/uk.ts | 4 +- dist/languages/vi.ts | 4 +- dist/languages/vi_VN.ts | 4 +- dist/languages/zh_CN.ts | 8 +- dist/languages/zh_TW.ts | 6 +- .../citron_emu/fragments/EmulationFragment.kt | 111 +++++++++--------- .../configuration/shared_translation.cpp | 2 +- src/citron/main.cpp | 2 +- .../frontend/ir/ir_emitter.cpp | 13 +- 30 files changed, 128 insertions(+), 112 deletions(-) diff --git a/dist/languages/ar.ts b/dist/languages/ar.ts index b890f4f97..7fa67b876 100644 --- a/dist/languages/ar.ts +++ b/dist/languages/ar.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6074,7 +6074,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii تحرير التطبيق الصغير diff --git a/dist/languages/ca.ts b/dist/languages/ca.ts index 474332d76..1d8720c91 100644 --- a/dist/languages/ca.ts +++ b/dist/languages/ca.ts @@ -407,7 +407,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6111,7 +6111,7 @@ Si us plau, utilitzi aquesta funció només per a instal·lar actualitzacions i - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/cs.ts b/dist/languages/cs.ts index cf18ed420..99c783a2e 100644 --- a/dist/languages/cs.ts +++ b/dist/languages/cs.ts @@ -407,7 +407,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6095,7 +6095,7 @@ Tuto funkci prosím používejte pouze k instalaci aktualizací a DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/da.ts b/dist/languages/da.ts index c5b86b640..6507d5dba 100644 --- a/dist/languages/da.ts +++ b/dist/languages/da.ts @@ -409,7 +409,7 @@ Dette vil bandlyse både vedkommendes forum-brugernavn og IP-adresse. - Mii Edit + Mii Editor @@ -6101,7 +6101,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/de.ts b/dist/languages/de.ts index a2497ff7e..0fce2b3ba 100644 --- a/dist/languages/de.ts +++ b/dist/languages/de.ts @@ -408,7 +408,7 @@ Dies würde deren Forum-Benutzernamen und deren IP-Adresse sperren. - Mii Edit + Mii Editor @@ -6121,7 +6121,7 @@ Bitte nutze diese Funktion nur zum Installieren von Updates und DLC. - Mii Edit Applet + Mii Editor Applet Mii-Edit-Applet diff --git a/dist/languages/el.ts b/dist/languages/el.ts index d9c6416d7..85d0dc0f1 100644 --- a/dist/languages/el.ts +++ b/dist/languages/el.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6097,7 +6097,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/es.ts b/dist/languages/es.ts index 1bb0eab54..d8c3b858d 100644 --- a/dist/languages/es.ts +++ b/dist/languages/es.ts @@ -409,7 +409,7 @@ Esto banearía su nombre del foro y su dirección IP. - Mii Edit + Mii Editor Editor de Mii @@ -6167,7 +6167,7 @@ Por favor, utiliza esta función sólo para instalar actualizaciones y DLCs. - Mii Edit Applet + Mii Editor Applet Applet de Editor de Mii diff --git a/dist/languages/fr.ts b/dist/languages/fr.ts index 6c397c7dc..9cb201f27 100644 --- a/dist/languages/fr.ts +++ b/dist/languages/fr.ts @@ -410,7 +410,7 @@ Cela bannirait à la fois son nom d'utilisateur du forum et son adresse IP. - Mii Edit + Mii Editor Édition de Mii @@ -6160,7 +6160,7 @@ Veuillez n'utiliser cette fonctionnalité que pour installer des mises à j - Mii Edit Applet + Mii Editor Applet Applet de l'éditeur Mii diff --git a/dist/languages/hu.ts b/dist/languages/hu.ts index ad654452d..06a440724 100644 --- a/dist/languages/hu.ts +++ b/dist/languages/hu.ts @@ -409,7 +409,7 @@ Ez kitiltaná a fórum felhasználóneve és az IP címe alapján. - Mii Edit + Mii Editor Mii szerkesztés @@ -6134,7 +6134,7 @@ Kérjük, csak frissítések és DLC-k telepítéséhez használd ezt a funkció - Mii Edit Applet + Mii Editor Applet Mii szerkesztő applet diff --git a/dist/languages/id.ts b/dist/languages/id.ts index f611be75d..1feca8026 100644 --- a/dist/languages/id.ts +++ b/dist/languages/id.ts @@ -409,7 +409,7 @@ Ini akan melarang nama pengguna forum mereka dan alamat IP mereka. - Mii Edit + Mii Editor Ubah Mii @@ -6154,7 +6154,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/it.ts b/dist/languages/it.ts index e12e40431..9d3b8a381 100644 --- a/dist/languages/it.ts +++ b/dist/languages/it.ts @@ -409,7 +409,7 @@ Questo bannerà sia il suo nome utente del forum che il suo indirizzo IP. - Mii Edit + Mii Editor @@ -6130,7 +6130,7 @@ Configurazione > Web. - Mii Edit Applet + Mii Editor Applet Editor dei Mii diff --git a/dist/languages/ja_JP.ts b/dist/languages/ja_JP.ts index 6d56078f1..7f025578b 100644 --- a/dist/languages/ja_JP.ts +++ b/dist/languages/ja_JP.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6116,7 +6116,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii 編集アプレット diff --git a/dist/languages/ko_KR.ts b/dist/languages/ko_KR.ts index ee92addc1..ce6028fd5 100644 --- a/dist/languages/ko_KR.ts +++ b/dist/languages/ko_KR.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6115,7 +6115,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/nb.ts b/dist/languages/nb.ts index f154082dd..bb2cd8d0d 100644 --- a/dist/languages/nb.ts +++ b/dist/languages/nb.ts @@ -409,7 +409,7 @@ Dette vil bannlyse både deres forum brukernavn og deres IP adresse. - Mii Edit + Mii Editor @@ -6120,7 +6120,7 @@ Bruk kun denne funksjonen til å installere oppdateringer og DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/nl.ts b/dist/languages/nl.ts index 66c6e8dc7..04e4395ca 100644 --- a/dist/languages/nl.ts +++ b/dist/languages/nl.ts @@ -409,7 +409,7 @@ Dit zou zowel hun forum gebruikersnaam als hun IP-adres verbannen. - Mii Edit + Mii Editor @@ -6108,7 +6108,7 @@ Gebruik deze functie alleen om updates en DLC te installeren. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/pl.ts b/dist/languages/pl.ts index 915af887a..2cf544da1 100644 --- a/dist/languages/pl.ts +++ b/dist/languages/pl.ts @@ -409,7 +409,7 @@ To zbanuje jego/jej nick na forum, oraz jego/jej adres IP. - Mii Edit + Mii Editor @@ -6111,7 +6111,7 @@ Proszę, używaj tej funkcji tylko do instalowania łatek i DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/pt_BR.ts b/dist/languages/pt_BR.ts index 95525595c..c89f3edfd 100644 --- a/dist/languages/pt_BR.ts +++ b/dist/languages/pt_BR.ts @@ -409,7 +409,7 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. - Mii Edit + Mii Editor Editar Mii @@ -6169,7 +6169,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLCs. - Mii Edit Applet + Mii Editor Applet Miniaplicativo Editor de Mii diff --git a/dist/languages/pt_PT.ts b/dist/languages/pt_PT.ts index 0ccf7654e..0316d45b4 100644 --- a/dist/languages/pt_PT.ts +++ b/dist/languages/pt_PT.ts @@ -409,7 +409,7 @@ Isto banirá tanto o nome de usuário do fórum como o endereço IP. - Mii Edit + Mii Editor Editar Mii @@ -6152,7 +6152,7 @@ Por favor, use esse recurso apenas para instalar atualizações e DLC. - Mii Edit Applet + Mii Editor Applet Applet Editor de Miis diff --git a/dist/languages/ru_RU.ts b/dist/languages/ru_RU.ts index 19bcb75c8..84a6f784b 100644 --- a/dist/languages/ru_RU.ts +++ b/dist/languages/ru_RU.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor Mii редактор @@ -6165,8 +6165,8 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet - Mii Edit Applet + Mii Editor Applet + Mii Editor Applet diff --git a/dist/languages/sv.ts b/dist/languages/sv.ts index 3bca755ab..e7fc6d5d0 100644 --- a/dist/languages/sv.ts +++ b/dist/languages/sv.ts @@ -409,7 +409,7 @@ Detta kommer bannlysa både dennes användarnamn på forum samt IP-adress. - Mii Edit + Mii Editor @@ -6090,7 +6090,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/tr_TR.ts b/dist/languages/tr_TR.ts index b04dce1c6..7ad9a10cb 100644 --- a/dist/languages/tr_TR.ts +++ b/dist/languages/tr_TR.ts @@ -409,7 +409,7 @@ Bu işlem onların hem forum kullanıcı adını hem de IP adresini banlar. - Mii Edit + Mii Editor @@ -6112,7 +6112,7 @@ Lütfen bu özelliği sadece güncelleme ve DLC yüklemek için kullanın. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/uk.ts b/dist/languages/uk.ts index 7a654eb2a..57e5a8761 100644 --- a/dist/languages/uk.ts +++ b/dist/languages/uk.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6124,7 +6124,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/vi.ts b/dist/languages/vi.ts index 48ac970e2..72fe27df3 100644 --- a/dist/languages/vi.ts +++ b/dist/languages/vi.ts @@ -409,7 +409,7 @@ Việc này sẽ ban tên người dùng trên diễn đàn và IP của họ lu - Mii Edit + Mii Editor @@ -6117,7 +6117,7 @@ Vui lòng, chỉ sử dụng tính năng này để cài đặt các bản cập - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/vi_VN.ts b/dist/languages/vi_VN.ts index 9041fa7d6..a24345e90 100644 --- a/dist/languages/vi_VN.ts +++ b/dist/languages/vi_VN.ts @@ -409,7 +409,7 @@ This would ban both their forum username and their IP address. - Mii Edit + Mii Editor @@ -6117,7 +6117,7 @@ Vui lòng, chỉ sử dụng tính năng này để cài các bản cập nhật - Mii Edit Applet + Mii Editor Applet diff --git a/dist/languages/zh_CN.ts b/dist/languages/zh_CN.ts index 6ce517c4e..535e6ae3a 100644 --- a/dist/languages/zh_CN.ts +++ b/dist/languages/zh_CN.ts @@ -409,8 +409,8 @@ This would ban both their forum username and their IP address. - Mii Edit - Mii Edit + Mii Editor + Mii Editor @@ -6165,8 +6165,8 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet - Mii Edit 小程序 + Mii Editor Applet + Mii Editor 小程序 diff --git a/dist/languages/zh_TW.ts b/dist/languages/zh_TW.ts index c21c27797..26a27fbd2 100644 --- a/dist/languages/zh_TW.ts +++ b/dist/languages/zh_TW.ts @@ -409,8 +409,8 @@ This would ban both their forum username and their IP address. - Mii Edit - Mii Edit + Mii Editor + Mii Editor @@ -6161,7 +6161,7 @@ Please, only use this feature to install updates and DLC. - Mii Edit Applet + Mii Editor Applet Mii 編輯器小程式 diff --git a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt index a01530079..d39d25898 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/fragments/EmulationFragment.kt @@ -10,6 +10,7 @@ import android.content.DialogInterface import android.content.pm.ActivityInfo import android.content.res.Configuration import android.net.Uri +import android.os.BatteryManager import android.os.Bundle import android.os.Handler import android.os.Looper @@ -531,59 +532,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { if (emulationViewModel.emulationStarted.value && !emulationViewModel.isEmulationStopping.value ) { - val thermalStatus = when (powerManager.currentThermalStatus) { - PowerManager.THERMAL_STATUS_LIGHT -> 0.25f - PowerManager.THERMAL_STATUS_MODERATE -> 0.5f - PowerManager.THERMAL_STATUS_SEVERE -> 0.75f - PowerManager.THERMAL_STATUS_CRITICAL, - PowerManager.THERMAL_STATUS_EMERGENCY, - PowerManager.THERMAL_STATUS_SHUTDOWN -> 1.0f - else -> 0f - } - - // Get temperature from battery thermal sensor - val temperature = try { - val process = Runtime.getRuntime().exec("cat /sys/class/power_supply/battery/temp") - val reader = process.inputStream.bufferedReader() - val temp = reader.readLine().toFloat() / 10f // Convert from decidegrees to degrees - reader.close() - temp - } catch (e: Exception) { - 0f - } - - // Convert to Fahrenheit - val fahrenheit = (temperature * 9f / 5f) + 32f - - if (_binding != null) { - // Color interpolation based on temperature (green at 30°C, red at 45°C) - val normalizedTemp = ((temperature - 30f) / 15f).coerceIn(0f, 1f) - val red = (normalizedTemp * 255).toInt() - val green = ((1f - normalizedTemp) * 255).toInt() - val color = android.graphics.Color.rgb(red, green, 0) - - // Create a modern progress bar using block elements - val progressBarLength = 12 - val filledBars = (thermalStatus * progressBarLength).toInt() - val progressBar = buildString { - append("│") // Left border - repeat(filledBars) { append("█") } - repeat(progressBarLength - filledBars) { append("░") } - append("│") // Right border - - // Add percentage - append(" ") - append(String.format("%3d%%", (thermalStatus * 100).toInt())) - } - - binding.showThermalsText.setTextColor(color) - binding.showThermalsText.text = String.format( - "%s\n%.1f°C • %.1f°F", - progressBar, - temperature, - fahrenheit - ) - } + val temperature = getBatteryTemperature(requireContext()) + updateThermalOverlay(temperature) thermalStatsUpdateHandler.postDelayed(thermalStatsUpdater!!, 1000) } } @@ -595,6 +545,53 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { } } + private fun updateThermalOverlay(temperature: Float) { + if (BooleanSetting.SHOW_THERMAL_OVERLAY.getBoolean() && + emulationViewModel.emulationStarted.value && + !emulationViewModel.isEmulationStopping.value + ) { + // Get thermal status + val thermalStatus = when (powerManager.currentThermalStatus) { + PowerManager.THERMAL_STATUS_LIGHT -> 0.25f + PowerManager.THERMAL_STATUS_MODERATE -> 0.5f + PowerManager.THERMAL_STATUS_SEVERE -> 0.75f + PowerManager.THERMAL_STATUS_CRITICAL, + PowerManager.THERMAL_STATUS_EMERGENCY, + PowerManager.THERMAL_STATUS_SHUTDOWN -> 1.0f + else -> 0f + } + + // Convert to Fahrenheit for additional info + val fahrenheit = (temperature * 9f / 5f) + 32f + + // Create progress bar using block elements + val progressBarLength = 12 + val filledBars = (thermalStatus * progressBarLength).toInt() + val progressBar = buildString { + append("│") // Left border + repeat(filledBars) { append("█") } + repeat(progressBarLength - filledBars) { append("░") } + append("│") // Right border + append(" ") + append(String.format("%3d%%", (thermalStatus * 100).toInt())) + } + + // Color interpolation based on temperature (green at 30°C, red at 45°C) + val normalizedTemp = ((temperature - 30f) / 15f).coerceIn(0f, 1f) + val red = (normalizedTemp * 255).toInt() + val green = ((1f - normalizedTemp) * 255).toInt() + val color = android.graphics.Color.rgb(red, green, 0) + + binding.showThermalsText.setTextColor(color) + binding.showThermalsText.text = String.format( + "%s\n%.1f°C • %.1f°F", + progressBar, + temperature, + fahrenheit + ) + } + } + @SuppressLint("SourceLockedOrientationActivity") private fun updateOrientation() { emulationActivity?.let { @@ -1095,4 +1092,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback { private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!) private val thermalStatsUpdateHandler = Handler(Looper.myLooper()!!) } + + private fun getBatteryTemperature(context: Context): Float { + val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as BatteryManager + // Get temperature in tenths of a degree Celsius + val temperature = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_TEMPERATURE) + // Convert to degrees Celsius + return temperature / 10.0f + } } diff --git a/src/citron/configuration/shared_translation.cpp b/src/citron/configuration/shared_translation.cpp index 0c727fb0d..393f49daf 100644 --- a/src/citron/configuration/shared_translation.cpp +++ b/src/citron/configuration/shared_translation.cpp @@ -34,7 +34,7 @@ std::unique_ptr InitializeTranslations(QWidget* parent) { INSERT(Settings, net_connect_applet_mode, tr("Net connect"), QStringLiteral()); INSERT(Settings, player_select_applet_mode, tr("Player select"), QStringLiteral()); INSERT(Settings, swkbd_applet_mode, tr("Software keyboard"), QStringLiteral()); - INSERT(Settings, mii_edit_applet_mode, tr("Mii Edit"), QStringLiteral()); + INSERT(Settings, mii_edit_applet_mode, tr("Mii Editor"), QStringLiteral()); INSERT(Settings, web_applet_mode, tr("Online web"), QStringLiteral()); INSERT(Settings, shop_applet_mode, tr("Shop"), QStringLiteral()); INSERT(Settings, photo_viewer_applet_mode, tr("Photo viewer"), QStringLiteral()); diff --git a/src/citron/main.cpp b/src/citron/main.cpp index 6a2255b22..fc221946b 100644 --- a/src/citron/main.cpp +++ b/src/citron/main.cpp @@ -4445,7 +4445,7 @@ void GMainWindow::OnMiiEdit() { auto mii_applet_nca = bis_system->GetEntry(MiiEditId, FileSys::ContentRecordType::Program); if (!mii_applet_nca) { - QMessageBox::warning(this, tr("Mii Edit Applet"), + QMessageBox::warning(this, tr("Mii Editor Applet"), tr("Mii editor is not available. Please reinstall firmware.")); return; } diff --git a/src/shader_recompiler/frontend/ir/ir_emitter.cpp b/src/shader_recompiler/frontend/ir/ir_emitter.cpp index b8bc5ea95..4a811178a 100644 --- a/src/shader_recompiler/frontend/ir/ir_emitter.cpp +++ b/src/shader_recompiler/frontend/ir/ir_emitter.cpp @@ -261,12 +261,23 @@ static U1 GetFlowTest(IREmitter& ir, FlowTest flow_test) { case FlowTest::RGT: return ir.LogicalAnd(ir.LogicalNot(ir.GetSFlag()), ir.LogicalNot(ir.GetZFlag())); case FlowTest::FCSM_TR: - return ir.LogicalAnd(ir.GetSFlag(), ir.LogicalNot(ir.GetZFlag())); + LOG_WARNING(Shader, "(STUBBED) FCSM_TR"); + return ir.Imm1(false); case FlowTest::CSM_TA: + LOG_WARNING(Shader, "(STUBBED) CSM_TA"); + return ir.Imm1(false); case FlowTest::CSM_TR: + LOG_WARNING(Shader, "(STUBBED) CSM_TR"); + return ir.Imm1(false); case FlowTest::CSM_MX: + LOG_WARNING(Shader, "(STUBBED) CSM_MX"); + return ir.Imm1(false); case FlowTest::FCSM_TA: + LOG_WARNING(Shader, "(STUBBED) FCSM_TA"); + return ir.Imm1(false); case FlowTest::FCSM_MX: + LOG_WARNING(Shader, "(STUBBED) FCSM_MX"); + return ir.Imm1(false); default: throw NotImplementedException("Flow test {}", flow_test); }