Improve various partially matched TUs (#2526)

This commit is contained in:
hatal175
2025-07-11 11:11:21 +03:00
committed by GitHub
parent a11f8f6375
commit b83ff69589
25 changed files with 285 additions and 1140 deletions
+86 -82
View File
@@ -11,6 +11,7 @@
#include "d/actor/d_a_obj_pillar.h"
#include "d/actor/d_a_player.h"
#include "d/d_cc_uty.h"
#include "d/d_s_play.h"
/* 80CE03CC-80CE03F0 0000EC 0024+00 1/1 0/0 0/0 .text __ct__14daObj_So_HIO_cFv */
daObj_So_HIO_c::daObj_So_HIO_c() {
@@ -112,26 +113,24 @@ static void so_hasira(obj_so_class* i_this) {
/* 80CE0744-80CE0C54 000464 0510+00 4/4 0/0 0/0 .text part_set__FP12obj_so_classSc */
static void part_set(obj_so_class* i_this, s8 param_2) {
// NONMATCHING
fopAc_ac_c* a_this = &i_this->actor;
cXyz sp48, sp54;
mDoMtx_stack_c::transS(a_this->current.pos.x, a_this->current.pos.y, a_this->current.pos.z);
mDoMtx_stack_c::YrotM(a_this->shape_angle.y);
mDoMtx_stack_c::XrotM(a_this->shape_angle.x);
mDoMtx_stack_c::YrotM((s16)a_this->shape_angle.y);
mDoMtx_stack_c::XrotM((s16)a_this->shape_angle.x);
f32 scale = a_this->scale.x;
mDoMtx_stack_c::scaleM(scale, scale, scale);
int sVar8, sVar7, sVar6, sVar5, sVar4 = 0;
for (int i = 0; i < 26; i++) {
mDoMtx_stack_c::push();
if (i < 2) {
sp48.x = 0.0f;
if (i == 0) {
sp48.y = 210.0f;
sp48.y = VREG_F(6) + 210.0f;
} else {
sp48.y = 0.0f;
sp48.y = VREG_F(7);
}
sp48.z = 0.0f;
mDoMtx_stack_c::multVec(&sp48, &i_this->field_0x618[i]);
@@ -141,7 +140,7 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
i_this->field_0xa28[i].x = a_this->shape_angle.x + (int)cM_rndFX(4000.0f);
}
} else if (i < 10) {
mDoMtx_stack_c::YrotM(sVar4 + -0xF18);
mDoMtx_stack_c::YrotM(8092 * i - 0xF18);
sp48.x = 0.0f;
sp48.y = 110.0f;
sp48.z = 90.0f;
@@ -155,14 +154,13 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
i_this->field_0x618[i].y += 60.0f;
}
} else {
mDoMtx_stack_c::YrotM(sVar4 + 0x4718);
mDoMtx_stack_c::YrotM(8092 * i + 18200);
sp48.x = 0.0f;
if (i <= 17) {
scale = 205.0f;
sp48.y = 205.0f;
} else {
scale = -5.0f;
sp48.y = -5.0f;
}
sp48.y = scale;
if ((i & 1) != 0) {
sp48.y += 8.0f;
}
@@ -171,7 +169,7 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
mDoMtx_stack_c::multVec(&sp48, &i_this->field_0x618[i]);
i_this->field_0xa28[i].y = a_this->shape_angle.y;
i_this->field_0xa28[i].x = a_this->shape_angle.x;
i_this->field_0xb60[i] = sVar4 + 0x4CE;
i_this->field_0xb60[i] = 8092 * i + 0x4CE;
i_this->field_0x7b8[i].set(1.0f, 0.8f, 1.0f);
}
@@ -183,9 +181,9 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
if (i_this->field_0x570 != 1) {
if (fopAcM_GetRoomNo(a_this) == 4) {
if (i < 2) {
cMtx_YrotS(*calc_mtx, sVar5 + 0x1EFF);
cMtx_YrotS(*calc_mtx, 0x2000 * i + 0x1EFF);
} else {
cMtx_YrotS(*calc_mtx, sVar6 + 0x253B);
cMtx_YrotS(*calc_mtx, 500 * i + 0x253B);
i_this->field_0xbfc[i] = cM_rndFX(6000.0f);
}
@@ -193,12 +191,12 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
sp48.z = cM_rndFX(5.0f) + 20.0f;
} else {
if (i < 2) {
cMtx_YrotS(*calc_mtx, sVar7 + (u16)-0x2000);
cMtx_YrotS(*calc_mtx, 0x8000 * i + (u16)-0x2000);
} else if (i < 10) {
cMtx_YrotS(*calc_mtx, sVar5 + 0xAAA);
cMtx_YrotS(*calc_mtx, 0x2000 * i + 0xAAA);
i_this->field_0xbfc[i] = cM_rndFX(4000.0f);
} else {
cMtx_YrotS(*calc_mtx, sVar8 + 0x1554);
cMtx_YrotS(*calc_mtx, 0x1000 * i + 0x1554);
i_this->field_0xbfc[i] = cM_rndFX(6000.0f);
}
@@ -207,7 +205,7 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
}
} else {
if (i < 2) {
cMtx_YrotS(*calc_mtx, sVar7 + 0x6000);
cMtx_YrotS(*calc_mtx, 0x8000 * i + 0x6000);
} else {
cMtx_YrotS(*calc_mtx, cM_rndFX(32768.0f));
i_this->field_0xbfc[i] = cM_rndFX(1000.0f);
@@ -225,12 +223,6 @@ static void part_set(obj_so_class* i_this, s8 param_2) {
MtxPosition(&sp48, &i_this->field_0x8f0[i]);
i_this->field_0xbc8[i] = cM_rndFX(32768.0f);
}
sVar8 += 0x1000;
sVar7 += -0x8000;
sVar6 += 500;
sVar5 += 0x2000;
sVar4 += 0x1F9C;
}
}
@@ -323,7 +315,6 @@ static void so_break(obj_so_class* i_this) {
/* 80CE1084-80CE12D8 000DA4 0254+00 1/1 0/0 0/0 .text so_hang__FP12obj_so_class */
static void so_hang(obj_so_class* i_this) {
// NONMATCHING
fopAc_ac_c* a_this = &i_this->actor;
fopAc_ac_c* actor = fopAcM_SearchByID(i_this->field_0x1b94);
@@ -364,6 +355,9 @@ static void so_hang(obj_so_class* i_this) {
dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0x1b9c);
dComIfGp_getVibration().StartShock(5, 1, cXyz(0.0f, 1.0f, 0.0f));
}
break;
case 3:
break;
}
}
@@ -427,9 +421,12 @@ static void part_move(obj_so_class* i_this) {
0x82AD,
};
fopAc_ac_c* a_this = &i_this->actor;
fopAc_ac_c* player = dComIfGp_getPlayer(0);
fopAc_ac_c* a_this = (fopAc_ac_c*)&i_this->actor;
cXyz spec, spf8, sp104;
s16 tempCos;
s16 iVar16 = 0;
s16 iVar17 = 0;
csXyz cStack_13c(0, 0, 0);
dBgS_ObjGndChk cStack_e0;
f32 fVar1;
@@ -439,11 +436,12 @@ static void part_move(obj_so_class* i_this) {
if (i_this->field_0x5fc[i] == 1) {
if (i < 2) {
if (i_this->field_0xc30[i] != 0) {
cLib_addCalcAngleS2(&i_this->field_0xa28[i].x, 0, 2, 300);
i_this->field_0xb94[i] += (s16)(cM_scos(i_this->field_0xa28[i].x) * 12000.0f);
cLib_addCalcAngleS2(&i_this->field_0xa28[i].x, NREG_S(7), 2, NREG_S(5) + 300);
tempCos = cM_scos(i_this->field_0xa28[i].x) * 12000.0f;
i_this->field_0xb94[i] += tempCos;
}
fVar1 = fabsf(70.0f * cM_ssin(i_this->field_0xa28[i].x)) + 5.0f;
fVar1 = fabsf((BREG_F(0) + 70.0f) * cM_ssin(i_this->field_0xa28[i].x)) + 5.0f;
} else if (i < 10) {
cLib_addCalcAngleS2(&i_this->field_0xa28[i].y, i_this->field_0xbc8[i], 1, 0x800);
if (i_this->field_0xc30[i] == 0) {
@@ -452,8 +450,9 @@ static void part_move(obj_so_class* i_this) {
cLib_addCalcAngleS2(&i_this->field_0xa28[i].x, -0x4000, 1, 0xC00);
}
fVar1 = fabsf(110.0f * cM_ssin(i_this->field_0xa28[i].x)) + 5.0f;
fVar1 = fabsf((BREG_F(2) + 110.0f) * cM_scos(i_this->field_0xa28[i].x)) + 5.0f;
} else {
fVar1 = 5.0f;
cLib_addCalcAngleS2(&i_this->field_0xa28[i].y, i_this->field_0xbc8[i], 1, 0x800);
if (i_this->field_0xc30[i] == 0) {
i_this->field_0xa28[i].x += i_this->field_0xbfc[i];
@@ -462,7 +461,7 @@ static void part_move(obj_so_class* i_this) {
}
cLib_addCalcAngleS2(&i_this->field_0xb60[i], 0, 1, 0xC00);
fVar1 = fabsf(40.0f * cM_ssin(i_this->field_0xa28[i].x)) + 5.0f;
fVar1 = fabsf((BREG_F(3) + 40.0f) * cM_ssin(i_this->field_0xa28[i].x)) + 5.0f;
}
i_this->field_0x618[i] += i_this->field_0x8f0[i];
@@ -488,8 +487,8 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x618[i].y = a_this->home.pos.y + fVar1;
if (i_this->field_0x8f0[i].y < 0.0f && i_this->field_0xc30[i] < 3) {
if (i_this->field_0xc30[i] == 0) {
fopAcM_effSmokeSet1(&i_this->field_0xc4c[i], &i_this->field_0xcb4[i], &i_this->field_0x618[i],
&cStack_13c, 1.0f, &a_this->tevStr, 0);
fopAcM_effSmokeSet2(&i_this->field_0xc4c[i], &i_this->field_0xcb4[i], &i_this->field_0x618[i],
&cStack_13c, TREG_F(19) + 1.0f, &a_this->tevStr);
dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0xc4c[i]);
dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0xcb4[i]);
@@ -531,7 +530,7 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x8f0[i].y = 5.0f;
i_this->field_0xc30[i] = 1;
i_this->field_0xa28[i].x = cM_rndFX(500.0f) + 1024.0f;
i_this->field_0xa28[i].x = cM_rndFX(500.0f) + -1024.0f;
}
}
}
@@ -543,11 +542,11 @@ static void part_move(obj_so_class* i_this) {
spec.x = i_this->field_0x618[i].x - i_this->field_0x618[j].x;
spec.z = i_this->field_0x618[i].z - i_this->field_0x618[j].z;
if (JMAFastSqrt(spec.x * spec.x + spec.z * spec.z) < 180.0f) {
if (JMAFastSqrt(spec.x * spec.x + spec.z * spec.z) < BREG_F(9) + 180.0f) {
cMtx_YrotS(*calc_mtx, cM_atan2s(spec.x, spec.z));
spec.x = 0.0f;
spec.y = 0.0f;
spec.z = 180.0f;
spec.z = BREG_F(9) + 180.0f;
MtxPosition(&spec, &spf8);
i_this->field_0x618[i].x = i_this->field_0x618[j].x + spf8.x;
i_this->field_0x618[i].z = i_this->field_0x618[j].z + spf8.z;
@@ -556,16 +555,16 @@ static void part_move(obj_so_class* i_this) {
}
mDoMtx_stack_c::transS(i_this->field_0x618[i].x, i_this->field_0x618[i].y + i_this->field_0x750[i], i_this->field_0x618[i].z);
mDoMtx_stack_c::XrotM(i_this->field_0xdc2);
mDoMtx_stack_c::XrotM((s16)i_this->field_0xdc2);
if (i == 0 || (i >= 10 && i <= 17)) {
mDoMtx_stack_c::YrotM(i_this->field_0xdb8);
mDoMtx_stack_c::YrotM((s16)i_this->field_0xdb8);
mDoMtx_stack_c::XrotM(i_this->field_0xdb6);
mDoMtx_stack_c::YrotM(-i_this->field_0xdb8);
}
if (i == 0) {
mDoMtx_stack_c::YrotM(i_this->field_0xb94[i]);
mDoMtx_stack_c::YrotM((s16)i_this->field_0xb94[i]);
mDoMtx_stack_c::XrotM(i_this->field_0xdb6);
} else if (i == 1) {
mDoMtx_stack_c::YrotM(-i_this->field_0xb94[i]);
@@ -591,9 +590,9 @@ static void part_move(obj_so_class* i_this) {
if (i >= 2 && i < 10 && i_this->field_0x5fc[i] == 2) {
sp104 = i_this->field_0x618[i];
if (i_this->field_0x1a98[i - 2] < 2) {
sp104.y += -80.0f;
i_this->field_0x10b8[i - 2].SetR(20.0f);
i_this->field_0x10b8[i - 2].SetH(165.0f);
sp104.y += XREG_F(5) + -80.0f;
i_this->field_0x10b8[i - 2].SetR(XREG_F(6) + 20.0f);
i_this->field_0x10b8[i - 2].SetH(XREG_F(7) + 165.0f);
if (i_this->field_0x1056 == 0) {
if (i_this->field_0x10b8[i - 2].ChkTgHit() != 0) {
i_this->mAtInfo.mpCollider = i_this->field_0x10b8[i - 2].GetTgHitObj();
@@ -619,9 +618,9 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x1ac0[i - 2] = i_this->field_0x618[i];
if (i_this->field_0x1a98[i - 2] >= 2) {
i_this->field_0x1a98[i - 2] = 2;
i_this->field_0x1ac0[i - 2].y += -90.0f;
i_this->field_0x1ac0[i - 2].y += AREG_F(9) + -90.0f;
} else {
i_this->field_0x1ac0[i - 2].y += -87.0f;
i_this->field_0x1ac0[i - 2].y += VREG_F(9) + -87.0f;
}
if (i_this->field_0x1a98[i - 2] == 2) {
@@ -643,7 +642,7 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x1b30[i - 2] = cM_rndFX(200.0f);
}
cXyz sp110(0.3f, 0.3f, 0.3f);
cXyz sp110(AREG_F(19) + 0.3f, AREG_F(19) + 0.3f, AREG_F(19) + 0.3f);
for (int j = 0; j < 3; j++) {
dComIfGp_particle_set(e_id[j], &i_this->field_0x618[i], &a_this->shape_angle, &sp110);
}
@@ -657,11 +656,12 @@ static void part_move(obj_so_class* i_this) {
if (i_this->field_0x1a98[i - 2] == 2) {
spec = i_this->field_0x618[i] - player->current.pos;
spec.y = 0.0f;
if (spec.abs() < 50.0f) {
f32 var_f30 = spec.abs();
if (var_f30 < 50.0f) {
cMtx_YrotS(*calc_mtx, cM_atan2s(spec.x, spec.z));
spec.x = 0.0f;
spec.y = 0.0f;
spec.z = (50.0f - fVar1) * 100.0f;
spec.z = (50.0f - var_f30) * (JREG_F(0) + 100.0f);
MtxPosition(&spec, &spf8);
cLib_addCalcAngleS2(&i_this->field_0xa28[i].x, spf8.z, 2, 0x400);
cLib_addCalcAngleS2(&i_this->field_0xa28[i].z, -spf8.x, 2, 0x400);
@@ -671,17 +671,17 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x1b40[i - 2]--;
}
int iVar4 = (i_this->field_0x1b40[i - 2] * 700) * cM_ssin(i_this->field_0xdac * 0x1300);
u32 uVar8 = (i_this->field_0x1b40[i - 2] * 700) * cM_ssin(i_this->field_0xdac * 0x1800);
mDoMtx_stack_c::YrotM(uVar8);
mDoMtx_stack_c::XrotM(iVar4);
mDoMtx_stack_c::scaleM(1.0f, 0.45f, 1.0f);
mDoMtx_stack_c::transM(0.0f, -20.0f, 0.0f);
i_this->field_0x750[i] = 80.0f;
iVar16 = (i_this->field_0x1b40[i - 2] * 700) * cM_ssin(i_this->field_0xdac * 0x1300);
iVar17 = (i_this->field_0x1b40[i - 2] * 700) * cM_ssin(i_this->field_0xdac * 0x1800);
mDoMtx_stack_c::YrotM(iVar17);
mDoMtx_stack_c::XrotM(iVar16);
mDoMtx_stack_c::scaleM(1.0f, AREG_F(6) + 0.45f, 1.0f);
mDoMtx_stack_c::transM(0.0f, AREG_F(8) + -20.0f, 0.0f);
i_this->field_0x750[i] = AREG_F(7) + 80.0f;
} else {
mDoMtx_stack_c::scaleM(1.0f, 0.5f, 1.0f);
mDoMtx_stack_c::transM(0.0f, -20.0f, 0.0f);
i_this->field_0x750[i] = 77.0f;
mDoMtx_stack_c::scaleM(1.0f, VREG_F(6) + 0.5f, 1.0f);
mDoMtx_stack_c::transM(0.0f, VREG_F(8) + -20.0f, 0.0f);
i_this->field_0x750[i] = VREG_F(7) + 77.0f;
}
}
@@ -692,8 +692,8 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x594[i]->setBaseTRMtx(mDoMtx_stack_c::get());
if (i <= 1 && fopAcM_GetRoomNo(a_this) == 2 && i_this->mBgW[i] != NULL && (i_this->field_0xc30[i] != 0 || i == 1)) {
mDoMtx_stack_c::transM(0.0f, -30.0f, 0.0f);
mDoMtx_stack_c::scaleM(1.0f, 8.0f, 1.0f);
mDoMtx_stack_c::transM(0.0f, KREG_F(6) + -30.0f, 0.0f);
mDoMtx_stack_c::scaleM(1.0f, KREG_F(7) + 8.0f, 1.0f);
MTXCopy(mDoMtx_stack_c::get(), i_this->mBgMtx[i]);
i_this->mBgW[i]->Move();
}
@@ -701,15 +701,16 @@ static void part_move(obj_so_class* i_this) {
}
for (int i = 0; i < 8; i++) {
if (i_this->field_0x1a98[i - 2] != 0) {
if (i_this->field_0x1a98[i - 2] == 2) {
if (i_this->field_0x1a98[i] != 0) {
if (i_this->field_0x1a98[i] == 2) {
spec = i_this->field_0x618[i + 2] - player->current.pos;
spec.y = 0.0f;
if (spec.abs() < 50.0f) {
f32 var_f29 = spec.abs();
if (var_f29 < 50.0f) {
cMtx_YrotS(*calc_mtx, cM_atan2s(spec.x, spec.z));
spec.x = 0.0f;
spec.y = 0.0f;
spec.z = (50.0f - fVar1) * 100.0f;
spec.z = (50.0f - var_f29) * (JREG_F(1) + 100.0f);
MtxPosition(&spec, &spf8);
cLib_addCalcAngleS2(&i_this->field_0x1b20[i], spec.z, 2, 0x400);
cLib_addCalcAngleS2(&i_this->field_0x1b30[i], -spec.x, 2, 0x400);
@@ -722,18 +723,18 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x1b50[i]--;
}
int iVar16 = (i_this->field_0x1b50[i] * 700) + cM_ssin(i_this->field_0xdac * 0x1500);
int iVar17 = (i_this->field_0x1b50[i] * 700) + cM_ssin(i_this->field_0xdac * 0x1200);
iVar16 = (i_this->field_0x1b50[i] * 700) * cM_ssin(i_this->field_0xdac * 0x1500);
iVar17 = (i_this->field_0x1b50[i] * 700) * cM_ssin(i_this->field_0xdac * 0x1200);
mDoMtx_stack_c::XrotM(i_this->field_0x1b20[i] + iVar16);
mDoMtx_stack_c::ZrotM(i_this->field_0x1b30[i] + iVar17 + -0x8000);
mDoMtx_stack_c::ZrotM(i_this->field_0x1b30[i] + iVar17 + 0x8000);
mDoMtx_stack_c::scaleM(i_this->field_0x7b8[i + 2].x, i_this->field_0x7b8[i + 2].y, i_this->field_0x7b8[i + 2].z);
if (i_this->field_0x1a98[i - 2] == 2) {
mDoMtx_stack_c::scaleM(1.0f, 0.45f, 1.0f);
mDoMtx_stack_c::transM(0.0f, -30.0f, 0.0f);
if (i_this->field_0x1a98[i] == 2) {
mDoMtx_stack_c::scaleM(1.0f, AREG_F(6) + 0.45f, 1.0f);
mDoMtx_stack_c::transM(0.0f, AREG_F(10) + -30.0f, 0.0f);
} else {
mDoMtx_stack_c::scaleM(1.0f, 0.5f, 1.0f);
mDoMtx_stack_c::transM(0.0f, -30.0f, 0.0f);
mDoMtx_stack_c::scaleM(1.0f, VREG_F(6) + 0.5f, 1.0f);
mDoMtx_stack_c::transM(0.0f, VREG_F(10) + -30.0f, 0.0f);
}
i_this->field_0x1aa0[i]->setBaseTRMtx(mDoMtx_stack_c::get());
@@ -741,16 +742,17 @@ static void part_move(obj_so_class* i_this) {
}
if (i_this->field_0x1054 == 0) {
s8 sVar2 = 0;
s8 sVar1 = 0;
u32 uVar1 = 0;
u32 uVar2 = 0;
for (int i = 0; i < 8; i++) {
if (i_this->field_0x1a98[i] == 2) {
s8 sVar2 = 0;
sVar2 = 0;
for (int j = 1; j < 8; j++) {
if (i_this->field_0x1a98[j] == 2) {
if (i_this->field_0x1a98[(i + j) & 7] == 2) {
sVar2++;
uVar1 &= 7;
uVar1 = (i + j) & 7;
} else {
sVar2 = 0;
}
@@ -760,6 +762,8 @@ static void part_move(obj_so_class* i_this) {
sVar1 = sVar2;
uVar2 = uVar1;
}
} else {
sVar2 = 0;
}
}
@@ -777,7 +781,7 @@ static void part_move(obj_so_class* i_this) {
cXyz sp11c(i_this->field_0x618[uVar2 + 2] - a_this->current.pos);
i_this->field_0xdbc = cM_atan2s(sp11c.x, sp11c.z);
i_this->field_0xdba = sVar1 * 500;
i_this->field_0xdba = sVar1 * (AREG_S(7) + 500);
if (sVar1 == 7) {
part_set(i_this, 1);
@@ -790,15 +794,15 @@ static void part_move(obj_so_class* i_this) {
i_this->field_0x750[i + 2] = 0.0f;
}
i_this->field_0xdba = 0;
i_this->field_0xdb6 = 0;
i_this->field_0xdbc = 0;
i_this->field_0xdb8 = 0;
i_this->field_0xdb8 = i_this->field_0xdbc = i_this->field_0xdb6 = i_this->field_0xdba = 0;
if (dStage_stagInfo_GetSTType(dComIfGp_getStage()->getStagInfo()) == 0) {
dComIfGs_onSwitch(fopAcM_GetParam(a_this) >> 24, fopAcM_GetRoomNo(a_this));
stage_stag_info_class* info = dComIfGp_getStage()->getStagInfo();
if (dStage_stagInfo_GetSTType(info) == 0) {
int sw = ((fopAcM_GetParam(a_this) & 0xff000000) >> 24);
dComIfGs_onSwitch(sw, fopAcM_GetRoomNo(a_this));
} else {
dComIfGs_onSwitch(fopAcM_GetParam(a_this) >> 16, fopAcM_GetRoomNo(a_this));
int sw = (fopAcM_GetParam(a_this) & 0xff0000) >> 16;
dComIfGs_onSwitch(sw, fopAcM_GetRoomNo(a_this));
}
}
}